<?php
declare(strict_types=1);

namespace app\common;

/**
 * YAML解析助手类
 * 用于在没有安装PHP YAML扩展时提供基础的YAML解析功能
 */
class YamlHelper
{
    /**
     * 解析YAML文件
     * @param string $file 文件路径
     * @return array
     */
    public static function parseFile(string $file): array
    {
        if (!is_file($file)) {
            return [];
        }

        $content = file_get_contents($file);
        if ($content === false) {
            return [];
        }

        return self::parse($content);
    }

    /**
     * 简单的YAML解析器（仅支持基础语法）
     * @param string $content YAML内容
     * @return array
     */
    protected static function parse(string $content): array
    {
        $lines = explode("\n", $content);
        $result = [];
        $stack = [];
        $currentIndent = 0;

        foreach ($lines as $line) {
            $line = rtrim($line);
            
            // 跳过空行和注释
            if (empty($line) || str_starts_with(trim($line), '#')) {
                continue;
            }

            // 获取缩进级别
            $indent = strlen($line) - strlen(ltrim($line));
            $line = trim($line);

            // 简单的键值对解析
            if (str_contains($line, ':')) {
                [$key, $value] = explode(':', $line, 2);
                $key = trim($key);
                $value = trim($value);

                // 处理空值
                if (empty($value)) {
                    if ($indent > $currentIndent) {
                        // 这是一个父节点
                        $result[$key] = [];
                        $stack[] = &$result[$key];
                        $currentIndent = $indent;
                    } else {
                        $result[$key] = '';
                    }
                    continue;
                }

                // 移除引号
                if (($value[0] ?? '') === '"' && ($value[-1] ?? '') === '"') {
                    $value = substr($value, 1, -1);
                } elseif (($value[0] ?? '') === "'" && ($value[-1] ?? '') === "'") {
                    $value = substr($value, 1, -1);
                }

                // 处理布尔值
                if ($value === 'true') {
                    $value = true;
                } elseif ($value === 'false') {
                    $value = false;
                } elseif ($value === 'null') {
                    $value = null;
                } elseif (is_numeric($value)) {
                    $value = str_contains($value, '.') ? (float)$value : (int)$value;
                }

                // 根据缩进级别决定在哪里放置数据
                if ($indent === 0) {
                    $result[$key] = $value;
                } elseif (!empty($stack)) {
                    $current = &$stack[count($stack) - 1];
                    $current[$key] = $value;
                }
            }
        }

        return $result;
    }
}